require "import"
import "android.widget.*"
import "android.view.*"
import "os"
import "android.app.AlertDialog"
import "android.widget.PopupMenu"
import "android.content.Intent"
import "android.net.Uri"
import "android.content.Context"
import "android.os.Vibrator"
import "android.view.inputmethod.InputMethodManager" -- Importação para gerenciar o teclado

-- Contexto para o vibrator
local context = service
local vibrator = context.getSystemService(Context.VIBRATOR_SERVICE)
-- InputMethodManager para controlar o teclado
local inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE)

-- Função para esconder o teclado
local function esconderTeclado(view)
    if view then
        inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0)
    end
end

-- Caminho para a pasta no armazenamento externo
local pastaFrasesBiblicas = "/sdcard/frases_biblicas"
local arquivoBiblia = pastaFrasesBiblicas .. "/biblia.txt"

-- Função para verificar e criar a pasta
local function criarPasta()
    local file = io.open(pastaFrasesBiblicas .. "/.test", "w")
    if file then
        file:close()
        os.remove(pastaFrasesBiblicas .. "/.test")
    else
        local resultado = os.execute("mkdir " .. pastaFrasesBiblicas)
        if resultado ~= 0 then
            print("Erro ao criar a pasta 'frases_biblicas'. Verifique permissões.")
        end
    end
end

-- Função para carregar versículos do arquivo .txt
local function carregarVersiculosDaPasta()
    local versiculos = {}
    local livroAtual = ""
    local capituloAtual = ""
    local file = io.open(arquivoBiblia, "r")
    if file then
        for linha in file:lines() do
            linha = linha:match("^%s*(.-)%s*$") -- Remove espaços em branco no início e fim
            if linha == "" then
                -- Ignora linhas em branco
            elseif linha:match("^%s*[IVXLCDM]+%s+[A-ZÇÁÉÍÓÚÂÊÔÃÕ%-]+$") then
                -- Detecta livros com numerais romanos (ex.: "I CORÍNTIOS", "II TIMÓTEO")
                livroAtual = linha
            elseif linha:match("^[A-ZÇÁÉÍÓÚÂÊÔÃÕ%-]+$") then
                -- Detecta livros sem numerais (ex.: "GÊNESIS", "GÁLATAS")
                livroAtual = linha
            elseif linha:match("^%s*[IVXLCDM]*%s*[A-ZÇÁÉÍÓÚÂÊÔÃÕ%-]+%s+%d+$") then
                -- Detecta capítulos (ex.: "GÊNESIS 1", "I CORÍNTIOS 16")
                livroAtual, capituloAtual = linha:match("^(%S+%s*[IVXLCDM]*%s*[A-ZÇÁÉÍÓÚÂÊÔÃÕ%-]+)%s+(%d+)$")
            elseif linha:match("^%d+%s+") then
                -- Detecta versículo (ex.: "1 No princípio...")
                local numero, texto = linha:match("^(%d+)%s+(.+)$")
                if numero and texto and livroAtual ~= "" and capituloAtual ~= "" then
                    local referencia = string.format("%s %s:%s", livroAtual, capituloAtual, numero)
                    table.insert(versiculos, {referencia = referencia, texto = texto})
                end
            end
        end
        file:close()
        if #versiculos > 0 then
            return versiculos
        else
            return nil
        end
    else
        return nil
    end
end

-- Variáveis para armazenar versículos e o livro selecionado
local versiculosAtuais = nil
local indiceAtual = 1
local livroSelecionado = nil -- Variável global para armazenar o livro selecionado

-- Função para exibir um versículo aleatório
function exibirVersiculoAleatorio()
    if not versiculosAtuais or #versiculosAtuais == 0 then
        textoResposta.setText("Nenhum versículo carregado. Coloque o arquivo 'biblia.txt' em " .. pastaFrasesBiblicas)
        service.speak("Nenhum versículo carregado. Por favor, adicione o arquivo bíblia ponto txt na pasta frases bíblicas.")
        return
    end
    
    indiceAtual = math.random(1, #versiculosAtuais)
    local versiculo = versiculosAtuais[indiceAtual]
    local texto = string.format(
        "📖 Versículo Aleatório:\n\n" ..
        "%s\n\n" ..
        "Referência: %s\n",
        versiculo.texto,
        versiculo.referencia
    )
    textoResposta.setText(texto)
    service.speak(versiculo.texto)
end

-- Layout da interface principal
layout = {
    LinearLayout;
    orientation = "vertical";
    layout_width = "match_parent";
    layout_height = "match_parent";
    backgroundColor = "#000000";
    padding = "10dp";
    {
        ScrollView;
        layout_width = "match_parent";
        layout_height = "0dp";
        layout_weight = "1";
        {
            LinearLayout;
            orientation = "vertical";
            layout_width = "match_parent";
            layout_height = "wrap_content";
            {
                TextView;
                id = "textoResposta";
                layout_width = "match_parent";
                layout_height = "wrap_content";
                text = "Bem-vindo ao aplicativo de Versículos. Carregando...",
                textSize = "16sp";
                textColor = "#ffffff";
                padding = "10dp";
            };
            {
                Button;
                text = "Copiar Versículo";
                textColor = "#ffffff";
                backgroundColor = "#00AA00";
                layout_width = "match_parent";
                layout_height = "wrap_content";
                layout_margin = "10dp";
                onClick = function()
                    if versiculosAtuais and indiceAtual >= 1 and indiceAtual <= #versiculosAtuais then
                        local versiculo = versiculosAtuais[indiceAtual]
                        local textoCompleto = string.format("%s - %s", versiculo.texto, versiculo.referencia)
                        service.copy(textoCompleto)
                        vibrator.vibrate(100)
                        service.speak("Versículo copiado: " .. textoCompleto)
                    else
                        service.speak("Nenhum versículo disponível para copiar.")
                    end
                end;
            };
        };
    };
    {
        LinearLayout;
        orientation = "horizontal";
        layout_width = "match_parent";
        layout_height = "wrap_content";
        gravity = "center";
        {
            Button;
            text = "Versículo Anterior";
            id = "botaoAnterior";
            textColor = "#ffffff";
            backgroundColor = "#0066AA";
            layout_width = "wrap_content";
            layout_height = "wrap_content";
            layout_margin = "5dp";
            onClick = function()
                if versiculosAtuais and indiceAtual > 1 then
                    indiceAtual = indiceAtual - 1
                    local versiculo = versiculosAtuais[indiceAtual]
                    local texto = string.format(
                        "📖 Versículo %d de %d:\n\n%s\n\nReferência: %s\n",
                        indiceAtual, #versiculosAtuais, versiculo.texto, versiculo.referencia
                    )
                    textoResposta.setText(texto)
                    service.speak(versiculo.texto)
                else
                    textoResposta.setText("Este é o primeiro versículo ou nenhum arquivo carregado!")
                    service.speak("Este é o primeiro versículo ou nenhum arquivo carregado!")
                end
            end;
        };
        {
            Button;
            text = "Próximo Versículo";
            id = "botaoProxima";
            textColor = "#ffffff";
            backgroundColor = "#0066AA";
            layout_width = "wrap_content";
            layout_height = "wrap_content";
            layout_margin = "5dp";
            onClick = function()
                if versiculosAtuais and indiceAtual < #versiculosAtuais then
                    indiceAtual = indiceAtual + 1
                    local versiculo = versiculosAtuais[indiceAtual]
                    local texto = string.format(
                        "📖 Versículo %d de %d:\n\n%s\n\nReferência: %s\n",
                        indiceAtual, #versiculosAtuais, versiculo.texto, versiculo.referencia
                    )
                    textoResposta.setText(texto)
                    service.speak(versiculo.texto)
                else
                    textoResposta.setText("Este é o último versículo ou nenhum arquivo carregado!")
                    service.speak("Este é o último versículo ou nenhum arquivo carregado!")
                end
            end;
        };
    };
    {
        Button;
        text = "Versículo Aleatório";
        textColor = "#ffffff";
        backgroundColor = "#FF8800";
        layout_width = "match_parent";
        layout_height = "wrap_content";
        layout_margin = "10dp";
        onClick = function()
            exibirVersiculoAleatorio()
        end;
    };
    {
        LinearLayout;
        orientation = "horizontal";
        layout_width = "match_parent";
        layout_height = "wrap_content";
        gravity = "center";
        layout_margin = "10dp";
        {
            Button;
            id = "botaoVelhoTestamento";
            text = "Velho Testamento";
            textColor = "#ffffff";
            backgroundColor = "#880088";
            layout_width = "wrap_content";
            layout_height = "wrap_content";
            layout_margin = "5dp";
            onClick = function(view)
                local popup = PopupMenu(context, view)
                local menu = popup.getMenu()
                local livrosVT = {
                    "GÊNESIS", "ÊXODO", "LEVÍTICO", "NÚMEROS", "DEUTERONÔMIO",
                    "JOSUÉ", "JUÍZES", "RUTE", "I SAMUEL", "II SAMUEL",
                    "I REIS", "II REIS", "I CRÔNICAS", "II CRÔNICAS", "ESDRAS",
                    "NEEMIAS", "ESTER", "JÓ", "SALMOS", "PROVÉRBIOS",
                    "ECLESIASTES", "CANTARES", "ISAÍAS", "JEREMIAS", "LAMENTAÇÕES",
                    "EZEQUIEL", "DANIEL", "OSEIAS", "JOEL", "AMÓS",
                    "OBADIAS", "JONAS", "MIQUEIAS", "NAUM", "HABACUQUE",
                    "SOFONIAS", "AGEU", "ZACARIAS", "MALAQUIAS"
                }
                for i, livro in ipairs(livrosVT) do
                    menu.add(0, i, 0, livro)
                end
                popup.setOnMenuItemClickListener(function(item)
                    livroSelecionado = livrosVT[item.getItemId()]
                    botaoVelhoTestamento.setText(livroSelecionado) -- Feedback visual
                    campoCapitulo.requestFocus()
                    service.speak("Livro selecionado: " .. livroSelecionado)
                    botaoNovoTestamento.setText("Novo Testamento") -- Reseta o outro botão
                    return true
                end)
                popup.show()
            end;
        };
        {
            Button;
            id = "botaoNovoTestamento";
            text = "Novo Testamento";
            textColor = "#ffffff";
            backgroundColor = "#880088";
            layout_width = "wrap_content";
            layout_height = "wrap_content";
            layout_margin = "5dp";
            onClick = function(view)
                local popup = PopupMenu(context, view)
                local menu = popup.getMenu()
                local livrosNT = {
                    "MATEUS", "MARCOS", "LUCAS", "JOÃO", "ATOS",
                    "ROMANOS", "I CORINTIOS", "II CORINTIOS", "GALATAS", "EFESIOS",
                    "FILIPENSES", "COLOSSENSES", "I TESSALONICENSES", "II TESSALONICENSES", "I TIMÓTEO",
                    "II TIMÓTEO", "TITO", "FILEMOM", "HEBREUS", "TIAGO",
                    "I PEDRO", "II PEDRO", "I JOÃO", "II JOÃO", "III JOÃO",
                    "JUDAS", "APOCALIPSE"
                }
                for i, livro in ipairs(livrosNT) do
                    menu.add(0, i, 0, livro)
                end
                popup.setOnMenuItemClickListener(function(item)
                    livroSelecionado = livrosNT[item.getItemId()]
                    botaoNovoTestamento.setText(livroSelecionado) -- Feedback visual
                    campoCapitulo.requestFocus()
                    service.speak("Livro selecionado: " .. livroSelecionado)
                    botaoVelhoTestamento.setText("Velho Testamento") -- Reseta o outro botão
                    return true
                end)
                popup.show()
            end;
        };
    };
    {
        LinearLayout;
        orientation = "horizontal";
        layout_width = "match_parent";
        layout_height = "wrap_content";
        gravity = "center";
        layout_margin = "10dp";
        {
            EditText;
            id = "campoCapitulo";
            hint = "Capítulo";
            textColor = "#ffffff";
            hintTextColor = "#888888";
            layout_width = "100dp";
            layout_height = "wrap_content";
            inputType = "number";
            textSize = "16sp";
            layout_marginRight = "10dp";
        };
        {
            EditText;
            id = "campoVersiculo";
            hint = "Versículo";
            textColor = "#ffffff";
            hintTextColor = "#888888";
            layout_width = "100dp";
            layout_height = "wrap_content";
            inputType = "number";
            textSize = "16sp";
        };
        {
            Button;
            text = "Ir";
            textColor = "#ffffff";
            backgroundColor = "#0066AA";
            layout_width = "wrap_content";
            layout_height = "wrap_content";
            layout_marginLeft = "10dp";
            onClick = function()
                local capitulo = tonumber(campoCapitulo.getText().toString())
                local versiculoNum = tonumber(campoVersiculo.getText().toString())
                if versiculosAtuais and capitulo and versiculoNum and livroSelecionado then
                    for i, versiculo in ipairs(versiculosAtuais) do
                        local livro, cap, ver = versiculo.referencia:match("^(.-)%s(%d+):(%d+)$")
                        if livro and livro == livroSelecionado and 
                           tonumber(cap) == capitulo and 
                           tonumber(ver) == versiculoNum then
                            indiceAtual = i
                            local texto = string.format(
                                "📖 Versículo %d de %d:\n\n%s\n\nReferência: %s\n",
                                indiceAtual, #versiculosAtuais, versiculo.texto, versiculo.referencia
                            )
                            textoResposta.setText(texto)
                            service.speak(versiculo.texto)
                            campoCapitulo.clearFocus()
                            campoVersiculo.clearFocus()
                            esconderTeclado(campoCapitulo)
                            campoCapitulo.setText("")
                            campoVersiculo.setText("")
                            return
                        end
                    end
                    textoResposta.setText("Versículo não encontrado no livro " .. livroSelecionado .. "!")
                    service.speak("Versículo não encontrado no livro " .. livroSelecionado .. "!")
                else
                    textoResposta.setText("Selecione um livro e digite um capítulo e versículo válidos!")
                    service.speak("Selecione um livro e digite um capítulo e versículo válidos!")
                end
                campoCapitulo.clearFocus()
                campoVersiculo.clearFocus()
                esconderTeclado(campoCapitulo)
            end;
        };
    };
    {
        Button;
        text = "Sair";
        backgroundColor = "#AA0000";
        textColor = "#ffffff";
        layout_width = "wrap_content";
        layout_height = "wrap_content";
        layout_margin = "10dp";
        onClick = function()
            dlg.dismiss()
        end;
    };
}

-- Inicialização do diálogo principal
dlg = LuaDialog()
dlg.setTitle("Versículos Bíblicos desenvolvido por Marcos Souza")
local view = loadlayout(layout)
dlg.setView(view)
dlg.show()

-- Mensagem de boas-vindas ao iniciar
service.speak("Seja bem-vindo ao Versículos Bíblicos")

-- Inicializar a pasta, carregar versículos
criarPasta()
versiculosAtuais = carregarVersiculosDaPasta()
service.speak("Bem-vindo ao aplicativo de Versículos Bíblicos. Carregando versículos...")
if versiculosAtuais then
    service.speak("Versículos carregados com sucesso")
    exibirVersiculoAleatorio()
else
    textoResposta.setText("Erro ao carregar os versículos. Verifique o arquivo 'biblia.txt' em " .. pastaFrasesBiblicas)
    service.speak("Erro ao carregar os versículos. Verifique o arquivo bíblia ponto txt na pasta frases bíblicas.")
end